from PIL import Image, ImageDraw, ImageFont
import os
import zhconv

def create_text_image(text, width, height, font_size=30, vertical=False):
    # 创建一个白色背景的图片
    img = Image.new('RGB', (width, height), color='white')
    draw = ImageDraw.Draw(img)
    
    # 加载字体
    try:
        font_path = '/System/Library/Fonts/STHeiti Medium.ttc'  # 这里以黑体-简为例
        font = ImageFont.truetype(font_path, font_size)
    except:
        font = ImageFont.load_default()
    
    if vertical:
        # 竖排文字处理
        x = (width - font_size) // 2  # 修改此行以居中
        y = (height - len(text) * font_size) // 2
        for char in text:
            draw.text((x, y), char, fill='black', font=font)
            y += font_size
    else:
        # 横排文字处理
        text_bbox = draw.textbbox((0, 0), text, font=font)
        text_width = text_bbox[2] - text_bbox[0]
        text_height = text_bbox[3] - text_bbox[1]
        x = (width - text_width) // 2
        y = (height - text_height) // 2
        draw.text((x, y), text, fill='black', font=font)
    
    return img

def process_images(keep_ratio=True, padding_left=20, padding_right=20, padding_top=20, padding_bottom=20):
    # 读取图片目录
    input_dir = 'woman/'
    output_dir = 'woman/textimg/'
    
    # 创建输出目录
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
        
    # 遍历目录下的所有图片
    for filename in os.listdir(input_dir):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
            # 读取原图
            img_path = os.path.join(input_dir, filename)
            original = Image.open(img_path)

            
            # 设置新的图片尺寸
            width, height = 400, 700  # 调整为与原图调整后大小一致
            text_height = 50
            text_width = 50
            
            # 创建文字图片
            text = os.path.splitext(filename)[0]  # 获取不带扩展名的文件名
         
            top_text = create_text_image(text, width, text_height)
            bottom_text = create_text_image(text, width, text_height)
            left_text = create_text_image(text, text_height, height, vertical=True)
            right_text = create_text_image(text, text_height, height, vertical=True)

            
            # 创建新图片
            new_width = width + 2 * text_height
            new_height = height + 2 * text_height
            new_image = Image.new('RGB', (new_width, new_height), 'white')
            
            # 粘贴图片
            new_image.paste(top_text, (text_height, 0))
            new_image.paste(bottom_text, (text_height, height + text_height))
            new_image.paste(left_text, (0, text_height))
            new_image.paste(right_text, (width + text_height, text_height))
            
            # 调整原图大小
            original_width, original_height = original.size
            
            if keep_ratio:
                # 保持原图比例
                # 考虑四周间距，实际可用区域减小
                available_width = width - (padding_left + padding_right)
                available_height = height - (padding_top + padding_bottom)
                
                ratio = min(available_width / original_width, available_height / original_height)
                new_size = (int(original_width * ratio), int(original_height * ratio))
                original_resized = original.resize(new_size, Image.LANCZOS)
                
                # 计算居中位置，加上间距
                x_offset = text_height + padding_left + (available_width - new_size[0]) // 2
                y_offset = text_height + padding_top + (available_height - new_size[1]) // 2
            else:
                # 拉伸图片以填充整个区域，但保留四周间距
                original_resized = original.resize((width - (padding_left + padding_right), 
                                                  height - (padding_top + padding_bottom)), 
                                                  Image.LANCZOS)
                x_offset = text_height + padding_left
                y_offset = text_height + padding_top
            
            # 粘贴图片
            new_image.paste(original_resized, (x_offset, y_offset))
            
            # 保存结果
            output_path = os.path.join(output_dir, f'{filename}')
            new_image.save(output_path)
            print(f'已处理: {filename}')

# 使用PIL将第二个图片合并到第一个图片的中间
def merge_images_center(dir1, dir2, outdir, keep_ratio=True, padding=20):
    """
    将dir2中的图片合并到dir1中的同名图片的中间位置
    
    参数:
    dir1 - 第一个图片目录（背景图片）
    dir2 - 第二个图片目录（中间图片）
    outdir - 输出目录
    keep_ratio - 是否保持第二个图片的原始比例
    padding - 第二个图片与四周的间距
    """
    need_rotate_images=['法.jpg', '愤怒.jpg', '父亲.jpg', '悲伤.jpg']
    # 创建输出目录
    if not os.path.exists(outdir):
        os.makedirs(outdir)
    
    # 获取两个目录中的文件列表
    files1 = os.listdir(dir1)
    files2 = os.listdir(dir2)
    
    # 找出两个目录中的共同文件
    common_files = set(files1).intersection(set(files2))
    
    for file in common_files:
        # 检查是否为图片文件
        if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff')):
            try:
                # 使用PIL读取图片
                img1 = Image.open(os.path.join(dir1, file))  # 背景图片
                img2 = Image.open(os.path.join(dir2, file))  # 中间图片
                
                # 获取背景图片的尺寸
                bg_width, bg_height = img1.size
                
                # 计算可用区域（考虑间距）
                available_width = bg_width - 2 * padding
                available_height = bg_height - 2 * padding
                
                if keep_ratio:
                    # 保持原图比例
                    img2_width, img2_height = img2.size
                    ratio = min(available_width / img2_width, available_height / img2_height)
                    new_size = (int(img2_width * ratio), int(img2_height * ratio))
                    img2_resized = img2.resize(new_size, Image.LANCZOS)
                    
                    # 计算居中位置
                    x_offset = padding + (available_width - new_size[0]) // 2
                    y_offset = padding + (available_height - new_size[1]) // 2
                else:
                    # 拉伸图片以填充可用区域
                    img2_resized = img2.resize((available_width, available_height), Image.LANCZOS)
                    x_offset = padding
                    y_offset = padding
                
                # 创建一个新的图片（复制背景图片）
                result = img1.copy()
                
                # 检查是否需要旋转图片
                if file in need_rotate_images:
                    # 创建旋转90度的图片副本
                    img2_rotated = img2_resized.rotate(90, expand=True)
                    
                    # 计算旋转后图片的新位置（保持居中）
                    rotated_width, rotated_height = img2_rotated.size
                    x_offset_rotated = padding + (available_width - rotated_width) // 2
                    y_offset_rotated = padding + (available_height - rotated_height) // 2
                    
                    # 将旋转后的图片粘贴到中间位置
                    result.paste(img2_rotated, (x_offset_rotated, y_offset_rotated))
                    
                    # 保存旋转后的图片
                    rotated_output_path = os.path.join(outdir, f'rotated_{file}')
                    rotated_result = img1.copy()
                    rotated_result.paste(img2_rotated, (x_offset_rotated, y_offset_rotated))
                    rotated_result.save(rotated_output_path)
                    print(f"已处理旋转图片: rotated_{file}")
                
                # 将原始第二个图片粘贴到中间位置
                result.paste(img2_resized, (x_offset, y_offset))
                
                # 保存结果
                output_path = os.path.join(outdir, file)
                result.save(output_path)
                print(f"已处理: {file}")
            except Exception as e:
                print(f"处理 {file} 时出错: {e}")

 

if __name__ == '__main__':
    # 可以通过参数控制是否保持原图比例以及四周间距
    # keep_ratio: True-保持原图比例, False-拉伸图片填充整个区域
    # padding_left/right/top/bottom: 控制中间图片与四周的间距
    # process_images(
    #     keep_ratio=False,
    #     padding_left=10,   # 左侧间距
    #     padding_right=10,  # 右侧间距
    #     padding_top=20,    # 上方间距
    #     padding_bottom=20  # 下方间距
    # )
    
    # 使用示例：将第二个目录中的图片合并到第一个目录中的图片中间
    merge_images_center(
        'woman/text/',  # 背景图片目录
        'woman/',     # 要放在中间的图片目录
        'woman/textimg/',      # 输出目录
        keep_ratio=True,       # 保持原图比例
        padding=60             # 与四周的间距
    )